﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using MyProj.MVCProj3.Model;
using MyProj.MVCProj3.IDAL;

namespace MyProj.MVCProj3.DAL
{
    //泛型类的泛型约束
    public class BaseRepository<T>:IBaseRepository<T> where T : class,new()
    {
        
        //类似于数据库，采用工厂方式获取实体的上下文对象 千万不要使用static 关键字 2013.6.4 
        //否则会造成无法添加数据，数据库数据更新而界面数据不更新（因为bll层的service 和dal层的repository中的entity状态不一致了）
        public ObjectContext db=DbContextFactory.GetCurrentDbContext();
        //ObjectSet 类型化实体集合 相当于数据库中的表
        //private ObjectSet<T> objectset = db.CreateObjectSet<T>();

        public IQueryable<T> LoadEntities(Func<T,bool> whereLamda)
        {
            return db.CreateObjectSet<T>().Where<T>(whereLamda).AsQueryable();
        }
        //泛型方法
        public IQueryable<T> LoadPageEntities<TKey>(int pageSize, int pageIndex, out int total, Func<T, bool> whereLamda, Func<T, TKey> ordeyByLamda, bool isAsc)
        {
            var temp = LoadEntities(whereLamda);

            total = temp.Count();
            if (isAsc)
            {
                return temp.OrderBy<T, TKey>(ordeyByLamda).Skip<T>(pageSize * (pageIndex - 1)).Take<T>(pageSize).AsQueryable<T>();
            }
            else
            {
                return temp.OrderByDescending<T, TKey>(ordeyByLamda).Skip<T>(pageSize * (pageIndex - 1)).Take<T>(pageSize).AsQueryable<T>();
            }

        }
    
        public bool AddEntity(T entity)
        {
            db.CreateObjectSet<T>().AddObject(entity);
            //db.SaveChanges();
            return true;
        }

        public bool DeleteEntity(T entity)
        {
            db.CreateObjectSet<T>().DeleteObject(entity);
            
            return true;
        }
        
        public bool UpdateEntity(T entity)
        {
            //可以直接修改entity的值，然后SaveChanges即可。
            db.CreateObjectSet<T>().ApplyCurrentValues(entity);
            //db.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
            return true;
        }
    }

    public class UserInfoRepository : BaseRepository<UserInfo>, IBaseRepository<UserInfo> 
    {
        
    }
}
